package com.mutual.assistance.user.service;


import com.mutual.assistance.response.PageParams;
import com.mutual.assistance.response.PageResult;
import com.mutual.assistance.user.model.bo.UserMessageBO;
import com.mutual.assistance.user.model.dto.UserAndRoleDTO;
import com.mutual.assistance.user.model.dto.UserDTO;
import com.mutual.assistance.user.model.dto.UserNoticeDTO;
import com.mutual.assistance.user.model.vo.*;

import java.util.List;

/**
 * @author chenyuxin
 * @version 1.0
 * @description 用户服务
 * @date 2023/4/17 16:39
 */
public interface UserService {

    /**
     * @param registerUserVo 用户注册请求参数
     * @description 用户注册
     * @author chenyuxin
     * @date 2023/4/24 21:19
     */
    void register(RegisterUserVO registerUserVo);

    /**
     * @param userId 用户id
     * @return 用户信息
     * @description 获取用户个人信息
     * @author chenyuxin
     * @date 2023/4/24 23:00
     */
    UserDTO getUserById(String userId);


    /**
     * @param userIds 用户id集合
     * @description 删除1到多个用户
     * @author chenyuxin
     * @date 2023/4/24 23:32
     */
    void deleteUser(List<String> userIds);

    /**
     * @param pageParams        分页参数
     * @param queryUserParamsVO 用户过滤参数
     * @return 所有用户信息
     * @description 获取所有用户信息
     * @author chenyuxin
     * @date 2023/4/25 17:19
     */
    PageResult<UserDTO> getAllUserMessage(PageParams pageParams, QueryUserParamsVO queryUserParamsVO);

    /**
     * @param updateUserPersonalParamsVO 更新参数
     * @description 更新用户个人信息
     * @author chenyuxin
     * @date 2023/4/25 18:00
     */
    void updatePersonalMessage(UpdateUserPersonalParamsVO updateUserPersonalParamsVO, String userId);

    /**
     * @param updateUserParamsVO 前端传入用户修改参数
     * @description 修改用户信息
     * @author chenyuxin
     * @date 2023/4/26 13:53
     */
    void updateUserMessage(UpdateUserParamsVO updateUserParamsVO);

    /**
     * @param userId 用户信息
     * @return 用户与角色信息
     * @description 获取指定用户与角色
     * @author chenyuxin
     * @date 2023/4/26 18:17
     */
    UserAndRoleDTO getUserAndRole(String userId);

    /**
     * @return 角色与用户集合
     * @description 获取所有用户与角色信息
     * @author chenyuxin
     * @date 2023/4/26 18:18
     */
    List<UserAndRoleDTO> getAllUserAndRole();


    /**
     * @description 为用户删除指定角色或所有角色
     * @param userId 用户id
     * @param roleId 角色id
     * @author chenyuxin
     * @date 2023/4/26 18:46
    */
    void deleteUserRole(String userId, String roleId);

    /**
     * @description 为用户添加权限
     * @param addUserAndRoleParamsVO 用户id，角色id， 管理员id
     * @author chenyuxin
     * @date 2023/4/26 19:05
    */
    void addUserRole(AddUserAndRoleParamsVO addUserAndRoleParamsVO);

    /**
     * @description 用户找回密码
     * @param retrievePasswordVO 找回密码参数
     * @author chenyuxin
     * @date 2023/4/26 19:31
    */
    void retrievePassword(RetrievePasswordVO retrievePasswordVO);

    /**
     * @description 为用户发送找回密码验证码
     * @param username 用户名称
     * @author chenyuxin
     * @date 2023/4/26 20:07
    */
    void sendEmail(String username);

    /**
     * @param username 用户名
     * @param credit 用户积分
     * @description 发布任务扣减用户积分
     * @author chenyuxin
     * @date 2023/4/29 16:41
     */
    void subscriberUserCredit(String username, Integer credit);

    /**
     * @description 创建一条用户信息
     * @param message 消息队列传入参数
     * @author chenyuxin
     * @date 2023/4/29 23:08
    */
    void createUserMessage(UserMessageBO message);

    /**
     * @description 获取用户消息
     * @param pageParams 分页参数
     * @param userId 用户id
     * @return 用户消息
     * @author chenyuxin
     * @date 2023/4/30 23:43
    */
    PageResult<UserNoticeDTO> getUserAllMessage(PageParams pageParams, String userId);

    /**
     * @description 删除用户消息
     * @param userId 用户id
     * @param messageId 消息id
     * @author chenyuxin
     * @date 2023/4/30 23:46
    */
    void deleteUserMessage(String userId, String messageId);

    /**
     * @description 回滚用户积分
     * @param userId 用户id
     * @param credit 积分id
     * @author chenyuxin
     * @date 2023/5/5 0:16
    */
    void rollbackCredit(String userId, Integer credit);

    /**
     * @description 获取任务信息通过用户名
     * @param username 用户名称
     * @return 用户相关信息
     * @author chenyuxin
     * @date 2023/5/5 0:26
    */
    UserDTO getUserByUserName(String username);

    /**
     * @description 更新用户星级
     * @param username 用户名
     * @param star 星级
     * @author chenyuxin
     * @date 2023/5/5 17:04
    */
    void updateUserStarByUsername(String username, Integer star);
}
